package cn.how2j.basics.middle.Lambda;

import cn.how2j.basics.charactor.Hero;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;

/**
 * Created by SilentJhin on 2020/8/18 19:46
 */
public class LambdaTest2 {
    public static boolean testHero(Hero h){
        return h.hp>100 && h.damage<50;
        //return 1;
    }

    public boolean testHero2(Hero h){
        return true;
    }

    public static void main(String[] args) {
        List<Hero> heros = null;
        // lambda 表达式
        filter(heros, h->h.hp>100 && h.damage<50);
        // lambda 表达式里调用静态方法
        filter(heros, h->LambdaTest2.testHero(h));
        // lambda 引用静态方法
        filter(heros, LambdaTest2::testHero);
        // lambda 引用对象方法
        filter(heros, new LambdaTest2()::testHero2);

        filter(heros, h -> h.matched());
        // ??? 引用容器中的对象方法
        filter(heros, Hero::matched);

        // 调用静态方法getList的三种方式
        // 1 匿名类
        Supplier<List> s = new Supplier<List>() {
            @Override
            public List get() {
                return new ArrayList();
            }
        };
        List list1 = getList(s);
        // 2 lambda 参数->return语句
        List list2 = getList(()->new ArrayList());
        // 3 引用构造器
        List list3 = getList(ArrayList::new);

    }

    private static void filter(List<Hero> heros, HeroChecker checker) {
        for (Hero hero : heros) {
            if(checker.test(hero)){
                System.out.print(hero);
            }
        }
    }

    public static List getList(Supplier<List> s) {
        return s.get();
    }
}
